package me.chenqiang.tre.rule;

import java.util.List;

import me.chenqiang.tre.entity.Card;
import me.chenqiang.tre.entity.Device;

/**
 * 表示规则链的类
 */
public class RuleChain {

	protected List<Rule> rules;
	protected Action defaultAction = Action.NORMAL;

	/**
	 * 
	 * @param rules         组成链的规则
	 * @param defaultAction 不匹配任何规则时的默认操作，通常为允许交易并不加收或折扣
	 */
	public RuleChain(List<Rule> rules, Action defaultAction) {
		super();
		this.rules = List.copyOf(rules);
		this.defaultAction = defaultAction;
	}

	/**
	 * 根据规则链对校园卡在终端上的交易进行判断
	 * 
	 * 按照顺序匹配每一条规则，如果匹配到则返回应执行的操作及参数，如果最终未匹配到任何规则，则返回默认操作及参数。
	 * 
	 * @param card
	 * @param device
	 * @return
	 */
	public Action process(Card card, Device device) {
		for (Rule rule : rules) {
			if (rule.matches(card, device)) {
				System.out.println(String.format("符合规则：%s %s", rule.getName(), rule.getAction()));
				return rule.getAction();
			}
		}
		System.out.println(String.format("默认操作：%s", this.defaultAction));
		return this.defaultAction;
	}

	public List<Rule> getRules() {
		return rules;
	}

	public Action getDefaultAction() {
		return defaultAction;
	}
}
